package com.yhao.utils.sign;

import java.util.Random;

public class YoutuSign {

    public static int getAppSign(String appId, String secret_id, String secret_key,
                              long expired, String userid, StringBuffer mySign) {
        return appSignBase(appId, secret_id, secret_key, expired, userid, null, mySign);
    }


    private static int appSignBase(String appId, String secret_id,
                                   String secret_key, long expired, String userid, String url,
                                   StringBuffer mySign) {
        if (empty(secret_id) || empty(secret_key)) {
            return -1;
        }
        String puserid = "";
        if (!empty(userid)) {
            if (userid.length() > 64) {
                return -2;
            }
            puserid = userid;
        }
        long now = System.currentTimeMillis() / 1000;
        int rdm = Math.abs(new Random().nextInt());
        //u为开发者创建应用时的QQ号
        //a为用户的AppID
        //k为用户的SecretID
        //t为当前时间戳，是一个符合UNIX Epoch时间戳规范的数值，单位为秒
        //e为此签名的凭证有效期，是一个符合UNIX Epoch时间戳规范的数值，单位为秒, e应大于t, 生成的签名在 t 到 e 的时间内 都是有效的. 如果是0, 则生成的签名只有再t的时刻是有效的.
        //r为随机串，无符号10进制整数，用户需自行生成，最长10位。
        //f为空
        String plain_text = "a=" + appId + "&k=" + secret_id +
                "&e=" + expired + "&t=" + now + "&r=" + rdm + "&u=" + puserid;//+ "&f=" + fileid.toString();

        byte[] bin = hashHmac(plain_text, secret_key);

        byte[] all = new byte[bin.length + plain_text.getBytes().length];
        System.arraycopy(bin, 0, all, 0, bin.length);
        System.arraycopy(plain_text.getBytes(), 0, all, bin.length, plain_text.getBytes().length);

        mySign.append(Base64Util.encode(all));

        return 0;
    }

    private static byte[] hashHmac(String plain_text, String accessKey) {

        try {
            return HMACSHA1.getSignature(plain_text, accessKey);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public static boolean empty(String s) {
        return s == null || s.trim().equals("") || s.trim().equals("null");
    }

}
